package upicgame.cart.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONObject;

import upicgame.cart.dao.CartDao;
import upicgame.cart.dao.impl.RedisCartDaoImpl;
import upicgame.entity.CartItem;
import upicgame.entity.Game;
import upicgame.entity.Library;
import upicgame.entity.User;
import upicgame.gamelibrary.dao.LibraryDao;

@Service
@Transactional
public class CartService {

	@Autowired
	private CartDao cd;
	@Autowired
	private RedisCartDaoImpl rcd;
	@Autowired
	private LibraryDao ld;

	// 给Contorller使用的获取购物项方法
	public Map<String, CartItem> getCartItem(Integer uid) {
		// 先获取Redis中的数据
		// 如果空就查mysql同时存入redis
		// 不空直接转换并且返回
		String json = rcd.getRedisCart("user:" + uid.toString() + ":cart");
//		System.out.println("redis json->:" + json);
		if (json != null) {
//			System.out.println("获取了redis的数据");
			Map<String, CartItem> map = getCartItemFromJSON(json);
			return map;
		} else {
			// getCartItemList 如果数据库内没数据会返回一个没有数据的map
			Map<String, CartItem> map = getCartItemFromMysql(uid);
			String j = toJsonCart(map);
			rcd.saveRedisCart("user:" + uid.toString() + ":cart", j);
			return map;
		}
	}

	public boolean addCartItem(Integer uid, Integer gid) {
		try {
			// 获取购物项数据 先查询redis redis为空的话就会查询mysql
			Map<String, CartItem> map = getCartItem(uid);
			// 查数据库是否已有该数据
			if (!map.containsKey(gid.toString())) {
				CartItem item = map.get(gid.toString());
				// 若数据库中为空,投影单查user game
				User user = cd.findUserById(uid);
				Game game = cd.findGameById(gid);
				item = new CartItem(user, game);
				// 确认库中是否拥有 如果拥有设置可结算状态为false
				Library lib = ld.findlibByUserAndGame(uid, gid);
				boolean isAccount = lib == null ? true : false;
				item.setAccount(isAccount);
				// 数据库中添加新数据
				cd.addCartItem(item);
//				System.out.println("item->>>>>>>>" + item.getId());
				// 在要存入redis的map中同步添加数据 key 游戏id value购物项
				map.put(game.getId().toString(), item);
				// 转换为JSON 并且存入redis
				String json = toJsonCart(map);
				rcd.saveRedisCart("user:" + uid.toString() + ":cart", json);
				return true;
			} else {
				// 购物车中不空
				// 但是在这购物项中不设置数量 更新一下信息`
				Game game = cd.findGameById(gid);
				map.get(gid.toString()).setGame(game);
				String json = toJsonCart(map);
				rcd.saveRedisCart("user:" + uid.toString() + ":cart", json);
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public boolean delCartItem(Integer uid, Integer gid) {
		try {
			Map<String, CartItem> map = getCartItem(uid);
			int result = cd.delCartItem(uid, gid);
			if (result > 0) {
				map.remove(gid.toString());
				String json = toJsonCart(map);
				rcd.saveRedisCart("user:" + uid.toString() + ":cart", json);
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public boolean clearCartItem(Integer uid) {
		try {
			Map<String, CartItem> map = getCartItem(uid);
			int result = cd.clearCartItem(uid);
			if (result > 0) {
				map.clear();
				String json = toJsonCart(map);
				rcd.saveRedisCart("user:" + uid.toString() + ":cart", json);
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public Double getTotalPrice(Map<String, CartItem> map) {
		double totalPrice = 0;
		for (Entry<String, CartItem> item : map.entrySet()) {
			CartItem i = item.getValue();
			if(i.isAccount()) {
			totalPrice += i.getGame().getDiscountprice();
			}
		}
		return totalPrice;
	}

	public String toJsonCart(Map<String, CartItem> map) {
		String json = JSONObject.toJSONString(map);
		System.out.println("toJson->" + json);
		return json;
	}

	public Map<String, CartItem> getCartItemFromJSON(String jsonObject) {
		Map<String, CartItem> map = new HashMap<>();
		Map<String, Object> temp = JSONObject.parseObject(jsonObject);
		// 第一次获取Value中是FastJson的JSONObject对象 还需要解析一次
		for (Entry<String, Object> entry : temp.entrySet()) {
			String json = JSONObject.toJSONString(entry.getValue());
			map.put(entry.getKey(), JSONObject.parseObject(json, CartItem.class));
		}
		return map;
	}

	public Map<String, CartItem> getCartItemFromRedis(Integer uid) {
		String json = rcd.getRedisCart("user:" + uid.toString() + ":cart");
		System.out.println("getCartItemFromRedis->" + json);
		Map<String, CartItem> map = new HashMap<>();
		if (json != null) {
			map = getCartItemFromJSON(json);
		}
		return map;
	}

	// 从数据库中获取CartItem
	public Map<String, CartItem> getCartItemFromMysql(Integer uid) {
		List<CartItem> temp = cd.getCartItemList(uid);
		Map<String, CartItem> map = new HashMap<>();
		// 重新制作一次数据 避免转JSON时把关联对象一起转换
		if (temp != null && temp.size() > 0) {
			for (CartItem c : temp) {
				Game game = c.getGame();
				User user = c.getUser();
				map.put(game.getId().toString(),
						new CartItem(c.getId(),
								new User(user.getId(), user.getUid(), user.getName(), user.getEmail(), user.getMoney()),
								new Game(game.getId(), game.getName(), game.getPrice(), game.getDiscountprice(),
										game.getImg(), game.getTag(), game.getDescription(), game.getPlatform(),
										game.getDeveloper())));
			}
		}
		return map;

	}

//	public List<CartItem> getCartItemList(Integer uid) {
//		List<CartItem> temp = cd.getCartItemList(uid);
//		List<CartItem> list = new ArrayList<>();
//		// 重新制作一次数据 避免转JSON时把关联对象一起转换
//		for (CartItem c : temp) {
//			Game game = c.getGame();
//			User user = c.getUser();
//			list.add(new CartItem(c.getId(),
//					new User(user.getId(), user.getUid(), user.getName(), user.getEmail(), user.getMoney()),
//					new Game(game.getId(), game.getName(), game.getPrice(), game.getDiscountprice(), game.getImg(),
//							game.getTag(), game.getDescription(), game.getPlatform(), game.getDeveloper())));
//		}
//		return list;
//
//	}

//	public String addCartItem(Integer uid, Integer gid, HttpServletRequest request) {
//		try {
//			List<CartItem> list = getCartItemInCookie(uid, request);
//
//			if (list == null) {
//				list = new ArrayList<CartItem>();
//			}
//
//			CartItem item = null;
//			item = cd.getCartItemByUGid(uid, gid);
//			if (item == null) {
//				User user = cd.findUserById(uid);
//				Game game = cd.findGameById(gid);
//				item = new CartItem(user, game);
//				cd.addCartItem(item);
//
//				list.add(item);
//				String json = toJsonCart(list);
//				return json;
//			} else {
//				Game game = cd.findGameById(gid);
//				for (int i = 0; i < list.size(); i++) {
//					CartItem c = list.get(i);
//					if (c.getGame().getId() == gid) {
//						c.setGame(game);
//					}
//				}
//				String json = toJsonCart(list);
//				return json;
//
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//			return "false";
//		}
//	}
//	public List<CartItem> getCartItemInCookie(Integer uid, HttpServletRequest request) {
//		Cookie[] cookies = request.getCookies();
//		String json = null;
//		try {
//			for (Cookie cookie : cookies) {
//				if (cookie.getName().equals(uid.toString())) {
//					json = URLDecoder.decode(cookie.getValue(), "UTF-8");
//				}
//			}
//			if (json != null) {
//				List<CartItem> items = JSONObject.parseArray(json, CartItem.class);
//				return items;
//			} else {
//				return null;
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//			return null;
//		}
//	}
}
